# skill.gd
class_name Skill extends Resource
## 基础技能资源类
##
## 用于定义可配置的战斗技能，通过继承实现具体技能效果
## 支持伤害类型、冷却时间、施法范围等战斗属性配置


#region 导出属性
@export_category("Damage Setting")
@export var base_damage: float = 0.0 ## 基础伤害值（不受属性加成的固定伤害)
@export var damage_type: GameConstant.DAMAGE_TYPE = GameConstant.DAMAGE_TYPE.PHYSICAL ## 伤害类型，影响抗性计算

# 技能元数据
@export_category("Skill Metadata")
@export var skill_name := "Unnamed Skill" ## 技能显示名称
@export var skill_type := GameConstant.SKILL_TYPE.ATTACK
@export_multiline var description := "Skill description" ## 技能描述文本


# 技能属性
@export_category("Skill Properties")
@export var base_cooldown: float = 5.0
@export var cooldown: float = 5.0 ## 冷却时间（秒）
@export var cast_time: float = 1 ## 施法前摇时间（秒）
@export var skill_range: float = 100.0 ## 有效施法范围（像素）
@export var group: String = "ally" ## 技能作用阵营（ally/enemy）
#endregion

#region 运行时状态
var is_on_cooldown: bool = false ## 冷却状态标志
var is_active: bool = false ## 技能激活状态（用于持续技能）
var _cooldown_timer: Timer ## 冷却计时器实例
var caster: Unit ## 技能施放者引用
var target: Unit ## 技能目标单位引用
#endregion

# 全局信号总线
var _global_signal := GlobalSignal

#region 生命周期管理
func _init() -> void:
	## 技能资源初始化时触发
	## 通知全局系统有新技能实例创建
	_global_signal.gs_skill_init.emit(self)
	
func set_caster(unit: Unit):
	## 设置技能施放者
	caster = unit
	# 通知全局系统技能施放者变更
	_global_signal.gs_skill_set_caster.emit(caster, self)

func set_target(unit: Unit):
	## 设置技能目标单位
	target = unit
#endregion

#region 核心逻辑
func execute() -> void:
	## 执行技能的主入口方法
	## 包含完整的技能使用流程：校验->触发事件->进入冷却->执行效果
	if not can_use():
		return
	
	# 触发技能使用前事件（可用于打断机制）
	_global_signal.gs_before_skill_used.emit(caster, target, self)
	
	# 启动冷却系统
	start_cooldown()
	
	# 执行具体技能效果（由子类实现）
	perform_skill_effect()

func perform_skill_effect() -> void:
	## 虚方法：实现具体技能效果
	## 必须被子类重写，基类不做任何实现
	pass

func can_use() -> bool:
	## 校验技能是否可用
	## 可被子类扩展（例如检查法力值、目标有效性等）
	return true
#endregion

#region 冷却系统
func start_cooldown() -> void:
	## 启动冷却计时器
	if _cooldown_timer:
		_cooldown_timer.stop()
	
	# 创建并配置新计时器
	_cooldown_timer = Timer.new()
	_cooldown_timer.wait_time = cooldown
	_cooldown_timer.one_shot = true
	_cooldown_timer.connect("timeout", _on_cooldown_finished)
	
	# 将计时器附加到施放者节点
	caster.add_child(_cooldown_timer)
	_cooldown_timer.start()
	
	is_on_cooldown = true
	# 通知全局系统冷却开始
	_global_signal.gs_skill_cooldown_started.emit(caster, self, cooldown)

func _on_cooldown_finished():
	## 冷却结束回调处理
	is_on_cooldown = false
	_global_signal.emit_signal("gs_skill_cooldown_ended", self)
	
	# 清理计时器节点
	if _cooldown_timer:
		_cooldown_timer.queue_free()
		_cooldown_timer = null
#endregion

func get_final_damage(_unit: Unit) -> float:
	return base_damage
